﻿package frEngine.math
{
    import flash.geom.*;

    public class NumberUtil extends Object
    {
        private static const sqrt3:Number = Math.sqrt(3);

        public function NumberUtil()
        {
            return;
        }// end function

        public static function rnd0_1() : Number
        {
            return Math.random();
        }// end function

        public static function rndMinus1_1() : Number
        {
            return Math.random() - Math.random();
        }// end function

        public static function rndMinMax(param1:Number, param2:Number) : Number
        {
            return param1 + Math.random() * (param2 - param1);
        }// end function

        public static function rndMinMaxInt(param1:int, param2:int) : int
        {
            return Math.round(rndMinMax(param1, param2));
        }// end function

        public static function sin0_1(param1:Number) : Number
        {
            return 0.5 + Math.sin(param1) * 0.5;
        }// end function

        public static function toLeftHandle(param1:Number) : Number
        {
            return -param1;
        }// end function

        public static function mylerp(param1:Number, param2:Number, param3:Number) : Number
        {
            return param1 + param3 * (param2 - param1);
        }// end function

        public static function getBezierData(param1:Number, param2:Number, param3:Number, param4:Number, param5:Vector3D) : Vector3D
        {
            param5.w = param1;
            param5.z = -3 * param1 + 3 * param3;
            param5.y = 3 * param1 - 6 * param3 + 3 * param4;
            param5.x = -param1 + 3 * param3 - 3 * param4 + param2;
            return param5;
        }// end function

        public static function getBezierTimeAndValue(param1:uint, param2:Vector3D, param3:Vector3D) : Number
        {
            var _loc_9:Number = NaN;
            var _loc_10:Number = NaN;
            var _loc_17:Number = NaN;
            var _loc_18:Number = NaN;
            var _loc_19:Number = NaN;
            var _loc_20:Number = NaN;
            var _loc_21:Number = NaN;
            var _loc_22:Number = NaN;
            var _loc_23:Number = NaN;
            var _loc_24:Number = NaN;
            var _loc_25:Number = NaN;
            var _loc_26:Number = NaN;
            var _loc_27:Number = NaN;
            var _loc_28:Number = NaN;
            var _loc_29:Number = NaN;
            var _loc_4:* = param2.x;
            var _loc_5:* = param2.y;
            var _loc_6:* = param2.z;
            var _loc_7:* = param2.w;
            var _loc_8:* = 3 * _loc_4;
            var _loc_11:* = 1 / 3;
            var _loc_12:* = _loc_7 - param1;
            var _loc_13:* = _loc_5 * _loc_5 - _loc_8 * _loc_6;
            var _loc_14:* = _loc_5 * _loc_6 - 9 * _loc_4 * _loc_12;
            var _loc_15:* = _loc_6 * _loc_6 - 3 * _loc_5 * _loc_12;
            var _loc_16:* = _loc_14 * _loc_14 - 4 * _loc_13 * _loc_15;
            if (_loc_16 >= 0)
            {
                _loc_9 = int(_loc_13 * _loc_5 - 1.5 * _loc_4 * _loc_14);
                _loc_10 = int(1.5 * _loc_4 * Math.sqrt(_loc_16));
                _loc_18 = _loc_9 + _loc_10;
                _loc_19 = _loc_9 - _loc_10;
                if (_loc_18 < 0)
                {
                    _loc_18 = -Math.pow(-_loc_18, _loc_11);
                }
                else
                {
                    _loc_18 = Math.pow(_loc_18, _loc_11);
                }
                if (_loc_19 < 0)
                {
                    _loc_19 = -Math.pow(-_loc_19, _loc_11);
                }
                else
                {
                    _loc_19 = Math.pow(_loc_19, _loc_11);
                }
                _loc_17 = (-_loc_5 - _loc_18 - _loc_19) / _loc_8;
            }
            else
            {
                _loc_20 = (2 * _loc_13 * _loc_5 - _loc_8 * _loc_14) / (2 * Math.pow(_loc_13, 1.5));
                _loc_21 = Math.acos(_loc_20) / 3;
                _loc_22 = Math.sqrt(_loc_13);
                _loc_23 = Math.cos(_loc_21);
                _loc_24 = (-_loc_5 - 2 * _loc_22 * _loc_23) / _loc_8;
                _loc_24 = int(_loc_24 * 1000) / 1000;
                if (_loc_24 >= 0 && _loc_24 <= 1)
                {
                    _loc_17 = _loc_24;
                }
                else
                {
                    _loc_25 = Math.sin(_loc_21);
                    _loc_9 = -_loc_5 + _loc_22 * _loc_23;
                    _loc_10 = _loc_22 * _loc_25 * sqrt3;
                    _loc_26 = (_loc_9 + _loc_10) / _loc_8;
                    _loc_27 = (_loc_9 - _loc_10) / _loc_8;
                    _loc_26 = int(_loc_26 * 1000) / 1000;
                    _loc_27 = int(_loc_27 * 1000) / 1000;
                    if (_loc_26 >= 0 && _loc_26 <= 1)
                    {
                        _loc_17 = _loc_26;
                    }
                    else if (_loc_27 >= 0 && _loc_27 <= 1)
                    {
                        _loc_17 = _loc_27;
                    }
                    else
                    {
                        trace("erorr:", _loc_24, _loc_26, _loc_27);
                    }
                }
            }
            if (param3)
            {
                _loc_28 = _loc_17 * _loc_17;
                _loc_29 = _loc_28 * _loc_17;
                return param3.x * _loc_29 + param3.y * _loc_28 + param3.z * _loc_17 + param3.w;
            }
            return _loc_17;
        }// end function

    }
}
